/**
 * SOP模块类型定义
 * @description 开放平台管理模块的所有TypeScript类型定义
 * @author AI Assistant
 * @since 1.0.0
 */

/**
 * 分页参数
 */
export interface PageParam {
  pageNo: number                // 页码
  pageSize: number              // 每页数量
}

/**
 * 分页结果
 */
export interface PageResult<T> {
  list: T[]                     // 数据列表
  total: number                 // 总数
}

// ==================== 应用管理类型 ====================

/**
 * 应用信息VO
 */
export interface AppInfoVO {
  id: number                    // 应用ID
  appId: string                 // 应用ID(APP+时间戳+随机数)
  appSecret: string             // 应用密钥(SHA256加密)
  merchantNo: string            // 商户编号
  appName: string               // 应用名称
  appDesc?: string              // 应用描述
  status: number                // 状态: 0-禁用 1-启用
  whiteIps?: string             // IP白名单(逗号分隔)
  notifyUrl?: string            // 回调地址
  rateLimit: number             // 限流配置(每分钟调用次数)
  expireTime?: string           // 过期时间
  createTime: string            // 创建时间
  updateTime?: string           // 更新时间
}

/**
 * 应用创建请求VO
 */
export interface AppInfoCreateReqVO {
  merchantNo: string            // 商户编号(必填)
  appName: string               // 应用名称(必填)
  appDesc?: string              // 应用描述
  whiteIps?: string             // IP白名单
  notifyUrl?: string            // 回调地址
  rateLimit: number             // 限流配置(必填)
  expireTime?: string           // 过期时间
}

/**
 * 应用更新请求VO
 */
export interface AppInfoUpdateReqVO extends AppInfoCreateReqVO {
  id: number                    // 应用ID(必填)
}

/**
 * 应用分页查询请求VO
 */
export interface AppInfoPageReqVO extends PageParam {
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  appName?: string              // 应用名称
  status?: number               // 状态
  createTime?: [string, string] // 创建时间范围
}

/**
 * 应用状态更新请求VO
 */
export interface AppStatusUpdateReqVO {
  id: number                    // 应用ID(必填)
  status: number                // 状态: 0-禁用 1-启用(必填)
}

/**
 * 重置应用密钥请求VO
 */
export interface AppSecretResetReqVO {
  id: number                    // 应用ID(必填)
}

// ==================== API日志管理类型 ====================

/**
 * API调用日志VO
 */
export interface ApiLogVO {
  id: number                    // 日志ID
  traceId: string               // 链路追踪ID
  appId: string                 // 应用ID
  merchantNo: string            // 商户编号
  apiPath: string               // API路径
  httpMethod: string            // HTTP方法
  requestParams?: string        // 请求参数
  requestBody?: string          // 请求体
  responseBody?: string         // 响应体
  httpStatus: number            // HTTP状态码
  businessCode?: string         // 业务状态码
  businessMsg?: string          // 业务消息
  clientIp: string              // 客户端IP
  userAgent?: string            // 用户代理
  executeTime: number           // 执行时间(毫秒)
  createTime: string            // 创建时间
}

/**
 * API日志分页查询请求VO
 */
export interface ApiLogPageReqVO extends PageParam {
  traceId?: string              // 链路追踪ID
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  apiPath?: string              // API路径
  httpMethod?: string           // HTTP方法
  httpStatus?: number           // HTTP状态码
  businessCode?: string         // 业务状态码
  clientIp?: string             // 客户端IP
  createTime?: [string, string] // 创建时间范围
}

/**
 * API日志导出请求VO
 */
export interface ApiLogExportReqVO {
  traceId?: string              // 链路追踪ID
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  apiPath?: string              // API路径
  httpMethod?: string           // HTTP方法
  httpStatus?: number           // HTTP状态码
  createTime?: [string, string] // 创建时间范围
}

// ==================== 统计分析类型 ====================

/**
 * API调用统计VO
 */
export interface ApiStatisticsVO {
  date: string                  // 统计日期
  totalCalls: number            // 总调用次数
  successCalls: number          // 成功调用次数
  failCalls: number             // 失败调用次数
  successRate: number           // 成功率(%)
  avgExecuteTime: number        // 平均执行时间(毫秒)
}

/**
 * API调用统计查询请求VO
 */
export interface ApiStatisticsReqVO {
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  apiPath?: string              // API路径
  dateRange: [string, string]   // 日期范围(必填)
  granularity: string           // 统计粒度: day-按天 hour-按小时(必填)
}

/**
 * 商户统计VO
 */
export interface MerchantStatisticsVO {
  merchantNo: string            // 商户编号
  merchantName?: string         // 商户名称
  totalCalls: number            // 总调用次数
  successCalls: number          // 成功调用次数
  failCalls: number             // 失败调用次数
  successRate: number           // 成功率(%)
  avgExecuteTime: number        // 平均执行时间(毫秒)
  lastCallTime?: string         // 最后调用时间
}

/**
 * 商户统计查询请求VO
 */
export interface MerchantStatisticsReqVO {
  merchantNo?: string           // 商户编号
  dateRange: [string, string]   // 日期范围(必填)
}

/**
 * 错误统计VO
 */
export interface ErrorStatisticsVO {
  errorCode: string             // 错误码
  errorMsg: string              // 错误消息
  errorCount: number            // 错误次数
  errorRate: number             // 错误率(%)
  firstOccurTime: string        // 首次出现时间
  lastOccurTime: string         // 最后出现时间
}

/**
 * 错误统计查询请求VO
 */
export interface ErrorStatisticsReqVO {
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  dateRange: [string, string]   // 日期范围(必填)
}

/**
 * 趋势分析VO
 */
export interface TrendAnalysisVO {
  date: string                  // 日期
  hour?: number                 // 小时(按小时统计时有值)
  callCount: number             // 调用次数
  successCount: number          // 成功次数
  failCount: number             // 失败次数
  avgExecuteTime: number        // 平均执行时间(毫秒)
}

/**
 * 趋势分析查询请求VO
 */
export interface TrendAnalysisReqVO {
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  dateRange: [string, string]   // 日期范围(必填)
  granularity: string           // 统计粒度: day-按天 hour-按小时(必填)
}

// ==================== 通知记录类型 ====================

/**
 * 通知记录VO
 */
export interface NotifyRecordVO {
  id: number                    // 记录ID
  appId: string                 // 应用ID
  merchantNo: string            // 商户编号
  notifyType: string            // 通知类型
  notifyUrl: string             // 通知地址
  notifyData: string            // 通知数据
  notifyStatus: number          // 通知状态: 0-待通知 1-通知成功 2-通知失败
  retryCount: number            // 重试次数
  maxRetryCount: number         // 最大重试次数
  nextRetryTime?: string        // 下次重试时间
  responseCode?: number         // 响应状态码
  responseBody?: string         // 响应内容
  createTime: string            // 创建时间
  updateTime?: string           // 更新时间
}

// 兼容视图层类型命名
export type NotifyVO = NotifyRecordVO

/**
 * 通知记录分页查询请求VO
 */
export interface NotifyRecordPageReqVO extends PageParam {
  appId?: string                // 应用ID
  merchantNo?: string           // 商户编号
  notifyType?: string           // 通知类型
  notifyStatus?: number         // 通知状态
  createTime?: [string, string] // 创建时间范围
}

/**
 * 手动重试通知请求VO
 */
export interface NotifyRetryReqVO {
  id: number                    // 记录ID(必填)
}

// ==================== 枚举类型定义 ====================

/**
 * 应用状态枚举
 */
export enum AppStatusEnum {
  DISABLED = 0,                 // 禁用
  ENABLED = 1                   // 启用
}

/**
 * HTTP方法枚举
 */
export enum HttpMethodEnum {
  GET = 'GET',                  // GET请求
  POST = 'POST',                // POST请求
  PUT = 'PUT',                  // PUT请求
  DELETE = 'DELETE',            // DELETE请求
  PATCH = 'PATCH'               // PATCH请求
}

/**
 * 统计粒度枚举
 */
export enum StatisticsGranularityEnum {
  DAY = 'day',                  // 按天统计
  HOUR = 'hour'                 // 按小时统计
}

/**
 * 通知状态枚举
 */
export enum NotifyStatusEnum {
  PENDING = 0,                  // 待通知
  SUCCESS = 1,                  // 通知成功
  FAILED = 2                    // 通知失败
}

/**
 * 通知类型枚举
 */
export enum NotifyTypeEnum {
  PAYMENT_SUCCESS = 'payment_success',     // 支付成功通知
  PAYMENT_REFUND = 'payment_refund',       // 退款通知
  SETTLE_SUCCESS = 'settle_success',       // 结算成功通知
  WITHDRAW_SUCCESS = 'withdraw_success'    // 提现成功通知
}
